moveLastToFirst = (arr) => {
	const lastItem = arr.pop(); // 删除数组的最后一项
	arr.unshift(lastItem); // 把最后一项添加到数组的第一项
	return arr; // 返回更新后的数组
}

moveFirstToLast = (arr) => {
	// 移除数组的最后一项
	const item = arr.shift();
	// 把移除的元素添加到数组的第一项位置
	arr.push(item);
	return arr;
}

/**
 * 数组去重
 */
uniqueArr = (arr) => {
	return [...new Set(arr)]
}

/**
 * 获取随机颜色
 */

const randomHexColor = () => `#${Math.floor(Math.random() * 0xffffff).toString(16).padEnd(6, "0")}`

getRandomColor = () => {
	return `#${Math.floor(Math.random() * 0xffffff) .toString(16)}`;
}

/**
 * 检测是否为空对象
 */
isEmptyObj = (obj) => {
	return Reflect.ownKeys(obj).length === 0 && obj.constructor === Object;
}

/**
 * 计算两个坐标之间的距离
 * @param {Object} p1
 * @param {Object} p2
 */
distance = (p1, p2) => {
	return Math.sqrt(Math.pow(p2.x - p1.x, 2) + Math.pow(p2.y - p1.y, 2));
}

/**
 * 求和
 */
sum = (...args) => {
	return args.reduce((a, b) => a + b);
}

/**
 * 计算数组平均值
 */
const average = (arr) => arr.reduce((a, b) => a + b) / arr.length;

/**
 * 比较两个时间大小
 */
compareTime = (a, b) => {
	return a.getTime() > b.getTime();
}

/**
 * 复制对象
 */
const copyObj = old => Object.assign({}, old)

/**
 * 合并对象
 * 使用扩展运算符 (...)
 * const mergedObj = { ...obj1, ...obj2 };
 */
const mergedObj = (obj1, obj2) => Object.assign({}, obj1, obj2);

//const mergedObj2 = (obj1,obj2) => {...obj1,...obj2};

/**
 * 对象转数组的三种简单方法
 */
const objectToArray = obj => Object.keys(obj).map(key => obj[key]);
const objectToArray2 = obj => Object.entries(obj);
const objectToArray3 = obj => Object.values(obj);

/**
 * 数组克隆
 *  const clone = (arr) => arr.slice(0);
	const clone = (arr) => [...arr];
	const clone = (arr) => Array.from(arr);
	const clone = (arr) => arr.map((x) => x);
	const clone = (arr) => JSON.parse(JSON.stringify(arr));
	const clone = (arr) => arr.concat([]);
	const clone = (arr) => structuredClone(arr);
 */

/**
 * 解决 toFixed() 四舍五入不准确的方案,以下2种方案都可以
 * toFixed()方法的四舍五入失效问题源于 JavaScript 浮点数的内部表示方式，在 JavaScript 中，所有的数字都是以 64 位浮点数（即双精度浮点数）的形式存储的。这种存储方式可能导致一些精度问题。
 */
roundToFixed = (num, decimalPlaces) => {
	const factor = Math.pow(10, decimalPlaces)
	return (Math.round(num * factor) / factor).toFixed(decimalPlaces)
}

roundToFixed2 = (num, decimalPlaces) => {
	return (Math.round((num + Number.EPSILON) * Math.pow(10, decimalPlaces)) / Math.pow(10, decimalPlaces)).toFixed(
		decimalPlaces
	)
}

/**
 * 从url获取参数并转为对象
 */
getParameters = URL => JSON.parse(
	`{"${decodeURI(URL.split("?")[1]).replace(/"/g, '\\"').replace(/&/g, '","').replace(/=/g, '":"')}"}`
)

/**
 * 反转字符串
 */
const reverseStr = str => str.split('').reverse().join('');

/**
 * 检查当前选项卡是否在后台
 * 浏览器使用选项卡式浏览，任何网页都有可能在后台,此时对用户来说是没有在浏览的, 知道怎么快速检测到，你的网页对用户是隐藏还是可见吗？
 */
const isTabActive = () => !document.hidden;

/**
 * 检测元素是否处于焦点
 */
const elementIsInFocus = (el) => (el === document.activeElement);

/**
 * 检查设备类型
 * 使用navigator.userAgent 判断是移动设备还是电脑设备：
 */
const judgeDeviceType =
	() => /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|OperaMini/i.test(navigator.userAgent) ? 'Mobile' : 'PC';

/**
 * 文字复制到剪贴板
 * Clipboard API 它的所有操作都是异步的，返回 Promise 对象，不会造成页面卡顿。而且，它可以将任意内容（比如图片）放入剪贴板。
 * Clipboard API 提供了以下方法，用于实现复制和粘贴：

1、navigator.clipboard.writeText(text)：这个方法用于将给定的文本复制到剪贴板。如果操作成功完成，它会返回一个已解析的 Promise。我们可以使用 await 来等待复制操作完成，或者使用 then 和 catch 来处理异步操作的结果。
2、navigator.clipboard.write(data) ：这个方法用于写入更复杂的数据类型，如文件、图像等。如果操作成功完成，它会返回一个已解析的 Promise。
3、navigator.clipboard.readText()：这个方法用于从剪贴板读取文本内容。它会返回一个 Promise，Promise 解析后会提供剪贴板中的文本内容。
4、navigator.clipboard.read()：这个方法用于读取更复杂的数据类型，如文件、图像等。它会返回一个 Promise，Promise 解析后会提供剪贴板中的数据。
 */
const copyText = async (text) => {
	//await navigator.clipboard.write(text);
	try {
		await navigator.clipboard.writeText(text);
		showToast('复制成功');
	} catch (error) {
		console.error('复制失败：', error);
		showToast('复制失败');
	}
};

/**
 * 获取选定的文本使用内置的 getSelection 获取用户选择的文本:
 */
const getSelectedText = () => window.getSelection().toString();

/**
 * 查询某天是否为工作日我们自己写日历组件时经常会用到，判断某个日期是否为工作日；周一至周五为工作日
 */
const isWeekday = (date) => date.getDay() % 6 !== 0;
